# pylint(1) completion                                     -*- shell-script -*-

_comp_cmd_pylint_message_ids()
{
    local filter=p
    [[ ${2-} ]] && filter="/^$2 messages/,/^$/p"
    # 6: arbitrary, assumed no ids shorter than that
    # TODO(scop): The fallback here is slow, maybe memoize whether
    #   --list-msgs-enabled worked (>= 2.4.0) and avoid unnecessary tries
    #   again later?
    local msgs="$(
        set -o pipefail
        ${1:-pylint} --list-msgs-enabled 2>/dev/null |
            command sed -ne "$filter" |
            command sed -ne 's/^[[:space:]]\{1,\}\([a-z-]\{6,\}\).*/\1/p' ||
            ${1:-pylint} --list-msgs 2>/dev/null |
            command sed -ne 's/^:\([a-z-]\{6,\}\).*/\1/p'
    )"
    _comp_delimited , -W "$msgs"
}

_pylint()
{
    local cur prev words cword split
    _init_completion -s || return

    local python=python
    [[ ${1##*/} == *3* ]] && python=python3

    case $prev in
        --version | --help | --long-help | --init-hook | \
            --ignore | --evaluation | --max-line-length | \
            --max-module-lines | --indent-string | --min-similarity-lines | \
            --max-args | --ignored-argument-names | --max-locals | \
            --max-returns | --max-branches | --max-statements | --max-parents | \
            --max-attributes | --min-public-methods | --max-public-methods | \
            --required-attributes | --bad-functions | --module-rgx | \
            --const-rgx | --class-rgx | --function-rgx | --method-rgx | \
            --attr-rgx | --argument-rgx | --variable-rgx | --inlinevar-rgx | \
            --good-names | --bad-names | --no-docstring-rgx | \
            --dummy-variables-rgx | --additional-builtins | --notes | \
            --ignored-classes | --generated-members | \
            --overgeneral-exceptions | --ignore-iface-methods | \
            --defining-attr-methods | --valid-classmethod-first-arg | \
            --valid-metaclass-classmethod-first-arg | -!(-*)[h])
            return
            ;;
        --fail-on | --help-msg)
            _comp_cmd_pylint_message_ids "$1"
            return
            ;;
        --enable | -!(-*)e)
            _comp_cmd_pylint_message_ids "$1" Disabled
            return
            ;;
        --disable | -!(-*)d)
            _comp_cmd_pylint_message_ids "$1" Enabled
            COMPREPLY+=($(compgen -W 'all' -- "$cur"))
            return
            ;;
        --rcfile)
            _filedir
            return
            ;;
        --persistent | --include-ids | --symbols | --files-output | \
            --reports | --comment | --ignore-comments | --ignore-docstrings | \
            --ignore-imports | --init-import | --ignore-mixin-members | \
            --zope | --suggestion-mode | -!(-*)[isr])
            COMPREPLY=($(compgen -W 'yes no' -- "$cur"))
            return
            ;;
        --load-plugins | --deprecated-modules)
            cur="${cur##*,}" _xfunc python _python_modules $python
            ((${#COMPREPLY[@]})) &&
                _comp_delimited , -W '"${COMPREPLY[@]}"'
            return
            ;;
        --jobs | -!(-*)j)
            COMPREPLY=($(compgen -W "{1..$(_ncpus)}" -- "$cur"))
            return
            ;;
        --confidence)
            local prefix=
            [[ $cur == *,* ]] && prefix="${cur%,*},"
            COMPREPLY=($(compgen -W "HIGH INFERENCE INFERENCE_FAILURE
                UNDEFINED" -- "${cur##*,}"))
            ((${#COMPREPLY[@]} == 1)) && COMPREPLY=(${COMPREPLY/#/$prefix})
            return
            ;;
        --format | -!(-*)f)
            COMPREPLY=($(compgen -W 'text parseable colorized json msvs' \
                -- "$cur"))
            return
            ;;
        --import-graph | --ext-import-graph | --int-import-graph)
            _filedir dot
            return
            ;;
    esac

    $split && return

    if [[ $cur == -* ]]; then
        COMPREPLY=($(compgen -W \
            '$(_parse_help "$1" --long-help)' -- "$cur"))
        [[ ${COMPREPLY-} == *= ]] && compopt -o nospace
        return
    fi

    [[ $cur == @(.|*/)* ]] || _xfunc python _python_modules $python
    _filedir py
} &&
    complete -F _pylint pylint pylint-2 pylint-3

# ex: filetype=sh
